﻿using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;
using System.Threading;
using NIIT.SaoBacDau.Aupi.HospitalManagement.Languages;
using NIIT.SaoBacDau.Aupi.HospitalManagement.Entities;
using NIIT.SaoBacDau.Aupi.HospitalManagement.BusinessLogic;

namespace NIIT.SaoBacDau.Aupi.HospitalManagement
{
    public partial class AddPatient : Form
    {
        private String form;

        private int states, typeaddpatient, patientID;

        private HM_ReceptionAndManagementPatient option;

        public AddPatient()
        {
            InitializeComponent();
        }

        public AddPatient(HM_ReceptionAndManagementPatient option, int ID)
        {
            InitializeComponent();
            this.option = option;
            if (option == HM_ReceptionAndManagementPatient.Patient_Edit)
            {
                this.option = option;
                cbx_Department.Enabled = false;
                lbl_AddPatient.Text = "Sửa Thông Tin Bệnh Nhân";
                btn_Reset.Enabled = false;
                form = "Sửa Thông Tin Bệnh Nhân";
                btn_Save.Enabled = true;
                btn_AddPatient.Enabled = false;
                this.patientID = ID;
            }
            else if (option == HM_ReceptionAndManagementPatient.Patient_Add)
            {
                lbl_AddPatient.Text = "Tiếp Nhận Bệnh Nhân";
                form = "Tiếp Nhận Bệnh Nhân";
                btn_AddPatient.Enabled = true;
                btn_Save.Enabled = false;
            }
        }

        #region Phần sự kiện trên form 
        
        private void cbx_States_SelectedIndexChanged(object sender, EventArgs e)
        {
            if (this.option == HM_ReceptionAndManagementPatient.Patient_Add)
            {
                if (cbx_States.SelectedIndex == 1)
                    DisableControl();
                else
                    EnabledControl();
            }
        }

        private void cbx_TypePatient_SelectedIndexChanged(object sender, EventArgs e)
        {
            if (cbx_TypePatient.SelectedIndex == 1)
                tbx_InsuranceID.Enabled = true;
            else
                tbx_InsuranceID.Enabled = false;
        }

        private void cbx_TypeTreatment_SelectedIndexChanged(object sender, EventArgs e)
        {
            if (cbx_TypeTreatment.SelectedIndex == 1)
                nud_BedID.Enabled = true;
            else
                nud_BedID.Enabled = false;
        }

        private void tbx_Occupation_KeyUp(object sender, KeyEventArgs e)
        {
            if (this.option == HM_ReceptionAndManagementPatient.Patient_Edit)
                tbx_AddressOccupation.ReadOnly = false;
            else
            {
                if (tbx_Occupation.Text.Length > 3)
                    tbx_AddressOccupation.ReadOnly = false;
                else
                    tbx_AddressOccupation.ReadOnly = true;
            }
        }

        private void tbx_ContactName_KeyUp(object sender, KeyEventArgs e)
        {
            if (this.option == HM_ReceptionAndManagementPatient.Patient_Edit)
            {
                tbx_ContactAddress.ReadOnly = false;
                tbx_ContactPhone.ReadOnly = false;
            }
            else
            {
                if (tbx_ContactName.Text.Length > 3)
                {
                    tbx_ContactAddress.ReadOnly = false;
                    tbx_ContactPhone.ReadOnly = false;
                }
                else
                {
                    tbx_ContactAddress.ReadOnly = true;
                    tbx_ContactPhone.ReadOnly = true;
                }
            }
        }

        private void btn_Reset_Click(object sender, EventArgs e)
        {
            if (LibraryLanguages.ResetAddPatient() == true)
                ResetForm();
        }

        private void btn_AddPatient_Click(object sender, EventArgs e)
        {
            DialogResult dr = MessageBox.Show("Bạn muốn thêm bệnh nhân mới ?", "Thêm bệnh nhân", MessageBoxButtons.YesNo, MessageBoxIcon.Question);
            if (dr == DialogResult.Yes)
            {
                if (cbx_States.SelectedIndex == 1)
                    AddQuickPatient();
                else if (cbx_States.SelectedIndex == 0)
                    AddPatients();
            }
        }

        private void btn_Save_Click(object sender, EventArgs e)
        {
            if (LibraryLanguages.SavePatient() == true)
                AddPatients();
        }

        private void btn_Close_Click(object sender, EventArgs e)
        {
            if (LibraryLanguages.CancelUserControl(form) == true)
            {
                ((Managements)this.MdiParent).DisableControl(HM_ReceptionAndManagementPatient.EnableElement);
                ((Managements)this.MdiParent).Clear();
            }
        }

        #endregion

        #region Phần phương thức sử lý

        private void ResetForm()
        {
            string date = String.Format("{0:yyyy/MM/dd HH:mm:ss}", DateTime.Now).ToString();
            tbx_HospitalizedDate.Text = date;
            tbx_PatientName.Text = "";
            tbx_HouseID.Text = "";
            tbx_Streets.Text = "";
            tbx_Biography.Text = "";
            tbx_District.Text = "";
            tbx_PhoneNumber.Text = "";
            tbx_Ethnic.Text = "";
            tbx_AddressEmail.Text = "";
            tbx_AddressOccupation.Text = "";
            tbx_ContactAddress.Text = "";
            tbx_ContactName.Text = "";
            tbx_ContactPhone.Text = "";
            tbx_DetailsMedicalID.Text = "";
            tbx_InsuranceID.Text = "";
            tbx_Occupation.Text = "";
            tbx_Ward.Text = "";
            dtp_BirthDay.ResetText();
            cbx_City.SelectedIndex = 0;
            cbx_States.SelectedIndex = 0;
            cbx_TypePatient.SelectedIndex = 0;
            cbx_TypeTreatment.SelectedIndex = 0;
            cbx_Department.SelectedIndex = 0;
            rbtn_GenderMale.Checked = true;
            tbx_DetailsMedicalID.Text = (BL_Pa_DetailsMedical.DetailsMedical() + 1).ToString();
            tbx_PatientID.Text = (BL_Pa_Patients.PtID() + 1).ToString();
        }

        private void Department()
        {
            cbx_Department.Items.Clear();
            List<D_OrganizationDetails> ListOrgDetails = BL_D_OrganizationDetailss.ListOrgDetails();
            for (int i = 0; i < ListOrgDetails.Count; i++)
            {
                cbx_Department.Items.Add(ListOrgDetails[i].NameDetails.ToString());
            }
            cbx_Department.SelectedIndex = 0;
        }

        private void Beds()
        {
            lv_DetailsBeds.Items.Clear();
            List<Report_Beds> ListBeds1 = BL_E_Bedss.InfBeds1();
            List<Report_Beds> ListBeds2 = BL_E_Bedss.InfBeds2();
            for (int i = 0; i < ListBeds1.Count; i++)
            {
                ListViewItem lvi = new ListViewItem(ListBeds1[i].DepartmentName.ToString());
                lvi.SubItems.Add(ListBeds1[i].TotalBeds.ToString());
                lvi.SubItems.Add(ListBeds2[i].TotalPatient.ToString());
                lvi.SubItems.Add((ListBeds1[i].TotalBeds - ListBeds2[i].TotalPatient).ToString());
                lv_DetailsBeds.Items.Add(lvi);
            }
        }

        private void City()
        {
            rbtn_GenderMale.Checked = true;
            String StringCity = "-- Chọn tỉnh / Thành phố --,An Giang,Bà Rịa Vũng Tàu,Bắc Cạn,Bắc Giang,Bạc Liêu,Bắc Ninh,Bến Tre,Bình Định,Bình Dương,"
                                     + "Bình Phước,Bình Thuận,Cà Mau,Cần Thơ,Cao Bằng,Đà Nẵng,Đăk Lăk,Điện Biên,Đồng Nai,Đồng Tháp,Gia Lai,Hà Giang,Hà Nam,Hà Nội,Hà Tĩnh,"
                                     + "Hải Dương,Hải Phòng,Hòa Bình,Hậu Giang,Hưng Yên,TP HCM,Khánh Hòa,Kiên Giang,Kon Tum,Lai Châu,Lào Cai,Lạng Sơn,Lâm Đồng,Long An,"
                                     + "Nam Định,Nghệ An,Ninh Bình,Ninh Thuận,Phú Thọ,Phú Yên,Quảng Bình,Quảng Nam,Quảng Ngãi,Quảng Ninh,Quản Trị,Sóc Trăng,Sơn La,"
                                     + "Tây Ninh,Thái Bình,Thái Nguyên,Thanh Hóa,Thừa Thiên-Huế,Tiền Giang,Trà Vinh,Truyên Quang,Vĩnh Long,Vĩnh Phúc,Yên Bái";
            string[] City = StringCity.Split(',');
            for (int i = 0; i < City.Length; i++)
            {
                cbx_City.Items.Add(City[i].ToString());
            }
            cbx_City.SelectedIndex = 0;
            cbx_States.SelectedIndex = 0;
        }

        private void LoadData()
        {
            Department();
            Beds();
            City();
            cbx_TypePatient.SelectedIndex = 0;
            cbx_TypeTreatment.SelectedIndex = 0;
            string date = String.Format("{0:yyyy/MM/dd HH:mm:ss}", DateTime.Now).ToString();
            tbx_HospitalizedDate.Text = date;
            tbx_DetailsMedicalID.Text = (BL_Pa_DetailsMedical.DetailsMedical() + 1).ToString();
            tbx_PatientID.Text = (BL_Pa_Patients.PtID() + 1).ToString();
        }

        private void EditPatient()
        {
            City();
            Beds();
            Pa_Patient objpt = new Pa_Patient();
            objpt.PatientID = this.patientID;
            Pa_Patient patient = BL_Pa_Patients.Patient(objpt);
            tbx_PatientID.Text = patient.PatientID.ToString();
            tbx_HospitalizedDate.Text = patient.HospitalizedDate.ToString();
            cbx_States.Text = patient.States.ToString();
            if (patient.Gender == true)
                rbtn_GenderMale.Checked = true;
            else
                rbtn_GenderWomen.Checked = true;
            tbx_PatientName.Text = patient.Name.ToString();
            cbx_TypePatient.Text = patient.TypePatient.ToString();
            dtp_BirthDay.Text = patient.BirthDay.ToString();
            tbx_InsuranceID.Text = patient.Cardnumber.ToString();
            cbx_TypeTreatment.Text = patient.TypeTreatment.ToString();
            if (string.IsNullOrEmpty(patient.BedsID) == false)
                nud_BedID.Value = Convert.ToInt32(patient.BedsID);
            tbx_HouseID.Text = patient.HouseID.ToString();
            tbx_Streets.Text = patient.Stress.ToString();
            tbx_Ward.Text = patient.Ward.ToString();
            tbx_District.Text = patient.District.ToString();
            cbx_City.Text = patient.City.ToString();
            tbx_PhoneNumber.Text = patient.PhoneNumber.ToString();
            tbx_Ethnic.Text = patient.Ethnic.ToString();
            if (string.IsNullOrEmpty(patient.AddressEmail) == false)
                tbx_AddressEmail.Text = patient.AddressEmail.ToString();
            tbx_Occupation.Text = patient.Occupation.ToString();
            tbx_AddressOccupation.Text = patient.AddressOccupation.ToString();
            tbx_ContactName.Text = patient.ContactPerson.ToString();
            tbx_ContactAddress.Text = patient.ContactAddress.ToString();
            tbx_ContactPhone.Text = patient.ContactPhone.ToString();
            tbx_Biography.Text = patient.Biography.ToString();

        }

        private Pa_Patient ObjPatient()
        {
            Pa_Patient pt = new Pa_Patient();
            pt.PatientID = Convert.ToInt32(tbx_PatientID.Text);
            pt.Name = tbx_PatientName.Text.ToString();
            pt.HouseID = tbx_HouseID.Text;
            pt.Stress = tbx_Streets.Text;
            pt.Ward = tbx_Ward.Text;
            pt.District = tbx_District.Text;
            pt.City = cbx_City.Text;
            if (rbtn_GenderMale.Checked == true)
                pt.Gender = true;
            else if (rbtn_GenderWomen.Checked == true)
                pt.Gender = false;
            pt.BirthDay = dtp_BirthDay.Text.ToString();
            pt.Occupation = tbx_Occupation.Text;
            pt.AddressOccupation = tbx_AddressOccupation.Text;
            pt.Ethnic = tbx_Ethnic.Text;
            pt.ContactPerson = tbx_ContactName.Text;
            pt.ContactAddress = tbx_ContactAddress.Text;
            pt.ContactPhone = tbx_ContactPhone.Text;
            pt.Biography = tbx_Biography.Text;
            pt.States = cbx_States.Text;
            pt.TypePatient = cbx_TypePatient.Text;
            pt.TypeTreatment = cbx_TypeTreatment.Text;
            pt.PhoneNumber = tbx_PhoneNumber.Text;
            pt.AddressEmail = tbx_AddressEmail.Text;
            pt.HospitalizedDate = tbx_HospitalizedDate.Text;
            pt.BedsID = nud_BedID.Value.ToString();
            if ((tbx_InsuranceID.Text.Length > 0) && (cbx_TypeTreatment.SelectedIndex == 0))
                typeaddpatient = 2;
            else if ((tbx_InsuranceID.Text.Length > 0) && (cbx_TypeTreatment.SelectedIndex == 1))
                typeaddpatient = 0;
            else if ((tbx_InsuranceID.Text.Length == 0) && (cbx_TypeTreatment.SelectedIndex == 0))
                typeaddpatient = 3;
            else if ((tbx_InsuranceID.Text.Length == 0) && (cbx_TypeTreatment.SelectedIndex == 1))
                typeaddpatient = 1;
            else
                typeaddpatient = 0;
            if (this.option == HM_ReceptionAndManagementPatient.Patient_Add)
            {
                D_OrganizationDetails ODS = new D_OrganizationDetails();
                ODS.NameDetails = cbx_Department.Text;
                pt.OrganizationDetailsID = BL_D_OrganizationDetailss.ObjOD(ODS).OrganizationDetailsID;
            }
            return pt;
        }

        private Pa_Patient ObjQuickPatient()
        {
            Pa_Patient pt = new Pa_Patient();
            pt.PatientID = Convert.ToInt32(tbx_PatientID.Text);
            if (rbtn_GenderMale.Checked == true)
                pt.Gender = true;
            else if (rbtn_GenderWomen.Checked == true)
                pt.Gender = false;
            pt.States = cbx_States.Text;
            D_OrganizationDetails ODS = new D_OrganizationDetails();
            pt.HospitalizedDate = tbx_HospitalizedDate.Text;
            ODS.NameDetails = cbx_Department.Text;
            pt.OrganizationDetailsID = BL_D_OrganizationDetailss.ObjOD(ODS).OrganizationDetailsID;
            return pt;
        }

        private void EnabledControl()
        {
            tbx_PatientName.Enabled = true;
            cbx_TypePatient.Enabled = true;
            dtp_BirthDay.Enabled = true;
            cbx_TypeTreatment.Enabled = true;
            tbx_HouseID.Enabled = true;
            tbx_Streets.Enabled = true;
            tbx_Ward.Enabled = true;
            tbx_District.Enabled = true;
            cbx_City.Enabled = true;
            tbx_PhoneNumber.Enabled = true;
            tbx_Ethnic.Enabled = true;
            tbx_AddressEmail.Enabled = true;
            tbx_Occupation.Enabled = true;
            tbx_AddressOccupation.Enabled = true;
            tbx_ContactName.Enabled = true;
            tbx_ContactAddress.Enabled = true;
            tbx_ContactPhone.Enabled = true;
            tbx_Biography.Enabled = true;
        }

        private void DisableControl()
        {
            tbx_PatientName.Enabled = false;
            cbx_TypePatient.Enabled = false;
            dtp_BirthDay.Enabled = false;
            cbx_TypeTreatment.Enabled = false;
            tbx_HouseID.Enabled = false;
            tbx_Streets.Enabled = false;
            tbx_Ward.Enabled = false;
            tbx_District.Enabled = false;
            cbx_City.Enabled = false;
            tbx_PhoneNumber.Enabled = false;
            tbx_Ethnic.Enabled = false;
            tbx_AddressEmail.Enabled = false;
            tbx_Occupation.Enabled = false;
            tbx_AddressOccupation.Enabled = false;
            tbx_ContactName.Enabled = false;
            tbx_ContactAddress.Enabled = false;
            tbx_ContactPhone.Enabled = false;
            tbx_Biography.Enabled = false;
        }

        private Pa_DetailsMedical DetailsMedical()
        {
            Pa_DetailsMedical dm = new Pa_DetailsMedical();
            dm.PatientID = Convert.ToInt32(tbx_PatientID.Text);
            return dm;
        }

        private void AddDetailsMedical()
        {
            Pa_DetailsMedical obj_DM = new Pa_DetailsMedical();
            obj_DM.DetailsMedicalID = Convert.ToInt32(tbx_DetailsMedicalID.Text);
            obj_DM.PatientID = Convert.ToInt32(tbx_PatientID.Text);
            BL_Pa_DetailsMedical.AddDetailsMedical(obj_DM);
        }

        private void AddPatients()
        {
            int Error;
            if (this.option == HM_ReceptionAndManagementPatient.Patient_Add)
                Error = BL_Pa_Patients.PatientError(ObjPatient(), typeaddpatient, 1);
            else
                Error = BL_Pa_Patients.PatientError(ObjPatient(), typeaddpatient, 2);
            switch (Error)
            {
                case 101:
                    LibraryLanguages.AddPatientError("Tên bệnh nhân không thể để trống !");
                    break;
                case 102:
                    LibraryLanguages.AddPatientError("Tên bệnh nhân từ 2 tới 50 ký tự từ a tới z , 0 tới 9 & dấu gạch dưới !");
                    break;
                case 103:
                    LibraryLanguages.AddPatientError("Số nhà không đúng định dạng !");
                    break;
                case 104:
                    LibraryLanguages.AddPatientError("Tên xã không thể để trống !");
                    break;
                case 105:
                    LibraryLanguages.AddPatientError("Tên( Xã / Phường ) không đúng định dạng từ a tới z và ký thự trống!");
                    break;
                case 106:
                    LibraryLanguages.AddPatientError("Tên( Huyện / Thị xã) không thể để trống !");
                    break;
                case 107:
                    LibraryLanguages.AddPatientError("Tên( Huyện/ Thị xã) không đúng định dạng từ a tới z và ký thự trống !");
                    break;
                case 108:
                    LibraryLanguages.AddPatientError("Số điện thoại không đúng định dạng !");
                    break;
                case 109:
                    LibraryLanguages.AddPatientError("Dân tộc không thể để trống !");
                    break;
                case 110:
                    LibraryLanguages.AddPatientError("Dân tộc không đúng định dạng từ a tới z và ký thự trống !");
                    break;
                case 111:
                    LibraryLanguages.AddPatientError("Địa chỉ email không đúng định dạng ...@... ");
                    break;
                case 112:
                    LibraryLanguages.AddPatientError("Nghề nghiệp không đúng định dạng từ a tới z và ký thự trống !");
                    break;
                case 113:
                    LibraryLanguages.AddPatientError("Tên người liên hệ không đúng định dạng từ a tới z và ký thự trống !");
                    break;
                case 114:
                    LibraryLanguages.AddPatientError("Số điện thoại người liên hệ không đúng định dạng !");
                    break;
                case 100:
                    LibraryLanguages.AddPatientError("Lỗi thực hiện khi thêm bệnh nhân   !");
                    break;
                case 000:
                    ShowExcute();
                    break;
                default:
                    break;
            }
        }

        private void ShowExcute()
        {
            if (this.option == HM_ReceptionAndManagementPatient.Patient_Add)
            {
                AddDetailsMedical();
                ContinueAddPatient();
            }
            else
            {
                LibraryLanguages.SavePatientSuccessfuly();
                ((Managements)this.MdiParent).ShowPatient(HM_ReceptionAndManagementPatient.Patient_Edit);
            }
        }

        private void AddQuickPatient()
        {
            ErrorAddPatient EAP = BL_Pa_Patients.AddQuickPatientError(ObjQuickPatient());
            switch (EAP)
            {
                case ErrorAddPatient.SQLError:
                    LibraryLanguages.SqlError();
                    break;
                case ErrorAddPatient.NoError:
                    AddDetailsMedical();
                    ContinueAddPatient();
                    break;
                default:
                    break;
            }
        }

        private void ContinueAddPatient()
        {
            Beds();
            if (LibraryLanguages.AddPatientSuccesfuly() == true)
                ResetForm();
            else
                this.Parent.Controls.Remove(this);
        }

        #endregion

        private void AddPatient_Load(object sender, EventArgs e)
        {
            if (this.option == HM_ReceptionAndManagementPatient.Patient_Add)
                LoadData();
            else if (this.option == HM_ReceptionAndManagementPatient.Patient_Edit)
                EditPatient();
        }
    }
}
